﻿/**
 * @file notifyevent.h
 * @author shijiaobing (503876187@qq.com)
 * @brief
 * @version 0.1
 * @date 2024-06-12
 *
 * @copyright Copyright (c) 2024
 *
 */
#ifndef NOTIFYEVENT_H
#define NOTIFYEVENT_H
#include <QMap>
#include <QList>
#include <QReadWriteLock>




/**
 * @brief  事件分发机制类
 *
 */


enum NotifyType {
    NOTIFY_DEFAULT_CTRL=0,
    NOTIFY_MENU_MANAGER_EVENT_TYPE = 0,
    NOTIFY_MAIN_WINDOW_EVENT_TYPE,

};
enum MENU_MANAGER_EVENT_TYPE
{
    /*
     *  0 代表长按菜单 1.代表repeat 2.代表finish
     */
    MENU=0,
    POWER_OFF,
    TAKE_PHOTO,
    ZOOM_OUT,
};

class NotifyEvent
{
public:
   
  
    /**
     * @brief 注册函数
     *
     */
    using  notify_event_func=void(*)(int,void*,void*context);


    /**
     * @brief  添加事件
     *
     * @param type  事件分发对象类型
     * @param func  函数
     * @param context 上下文
     */
    static void add(NotifyType type,notify_event_func func,void* context);


    /**
     * @brief 移除事件分发
     *
     * @param func
     * @param conetxt
     */
    static void remove(notify_event_func func,void *conetxt);

    /**
     * @brief 通知下发事件
     *
     * @param type
     * @param event
     * @param data
     */
    static void notify(NotifyType type,int event,void *data);


    static void notify(int event,void* data=nullptr);

    /**
     * @brief 清除事件对象
     *
     */
    static  void clear();

private:
    static QMap<NotifyType,QList<std::pair<notify_event_func,void*>> >  s_notifys;

    static QReadWriteLock *s_lock;
};

#endif // NOTIFYEVENT_H
